package cn.youqu.happy.module.youqu.service.arrangeEdit;

import cn.youqu.happy.framework.common.pojo.PageResult;
import cn.youqu.happy.module.youqu.controller.admin.arrangeEdit.vo.ArrangeEditCreateReqVO;
import cn.youqu.happy.module.youqu.controller.admin.arrangeEdit.vo.ArrangeEditExportReqVO;
import cn.youqu.happy.module.youqu.controller.admin.arrangeEdit.vo.ArrangeEditPageReqVO;
import cn.youqu.happy.module.youqu.controller.admin.arrangeEdit.vo.ArrangeEditUpdateReqVO;
import cn.youqu.happy.module.youqu.controller.app.arrangeEdit.vo.AppArrangeEditCreateReqVO;
import cn.youqu.happy.module.youqu.controller.app.arrangeEdit.vo.AppArrangeEditStateReqVO;
import cn.youqu.happy.module.youqu.dal.dataobject.arrangeEdit.ArrangeEditDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 计划申请修改 Service 接口
 *
 * @author 王其岩 20112001045
 */
public interface ArrangeEditService {

    /**
     * 创建计划申请修改
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createArrangeEdit(@Valid ArrangeEditCreateReqVO createReqVO);

    /**
     * 更新计划申请修改
     *
     * @param updateReqVO 更新信息
     */
    void updateArrangeEdit(@Valid ArrangeEditUpdateReqVO updateReqVO);

    /**
     * 申请人更新计划申请修改
     *
     * @param updateReqVO 更新信息
     */
    void updateArrangeEdit(@Valid ArrangeEditUpdateReqVO updateReqVO, Long uid);

    /**
     * 删除计划申请修改
     *
     * @param id 编号
     */
    void deleteArrangeEdit(Integer id);

    /**
     * 取消计划编辑申请
     *
     * @param id
     * @param reason
     * @param applyUid
     * @return
     */
    boolean cancelArrangeEdit(Integer id, String reason, Long applyUid);

    /**
     * 获得计划申请修改
     *
     * @param id 编号
     * @return 计划申请修改
     */
    ArrangeEditDO getArrangeEdit(Integer id);

    ArrangeEditDO getArrangeEdit(Integer id, Long uid);

    /**
     * 获得计划申请修改列表
     *
     * @param ids 编号
     * @return 计划申请修改列表
     */
    List<ArrangeEditDO> getArrangeEditList(Collection<Integer> ids);

    List<ArrangeEditDO> getArrangeEditList(Collection<Integer> ids, Long uid);

    /**
     * 获得计划申请修改分页
     *
     * @param pageReqVO 分页查询
     * @return 计划申请修改分页
     */
    PageResult<ArrangeEditDO> getArrangeEditPage(ArrangeEditPageReqVO pageReqVO);

    PageResult<ArrangeEditDO> getArrangeEditPage(ArrangeEditPageReqVO pageReqVO, Long uid);

    /**
     * 获得计划申请修改列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 计划申请修改列表
     */
    List<ArrangeEditDO> getArrangeEditList(ArrangeEditExportReqVO exportReqVO);

    /**
     * 判断用户是否拥有安排编辑权限
     *
     * @param id
     * @param partner
     * @return
     */
    boolean validateUserOwnArrangeEdit(Integer id, Long partner);

    /**
     * 表态 同意or拒绝
     *
     * @param stateReqVO
     * @param uid
     * @return
     */
    boolean stateArrangeEdit(AppArrangeEditStateReqVO stateReqVO, Long uid);

    Integer createArrangeEdit(AppArrangeEditCreateReqVO createReqVO, Long loginUserId);

    /**
     * 是否存在计划申请
     * @param arrangeId
     * @return
     */
    boolean alreadyHaveArrangeEdit(Integer arrangeId);

    boolean canCreateArrangeEdit(Integer arrangeId,Long uid);

}
